/*
 * APlusCalendar.java
 *  Finals Completion Project
 *
 * The following codes are the work of the IT.WORKS team in   
 * fulfillment of the requirement for Programming Applications
 * class code 9607. Copying of this work will result to 
 * serious consequences both to the IT.WORKs team and the plagiarizing 
 * party
 */

import java.util.Scanner;
import java.util.GregorianCalendar;

/**
 * This program is the class that prints 
 *  a calendar 
 *
 * @author 2132446 Matib,Nicole 
 *
 * @version 2.0.6
 */



public class APlusCalendar {
	public static void main(String[] args) {
		
		Scanner input = new Scanner(System.in);
         GregorianCalendar date = new GregorianCalendar();

		int year = date.get(GregorianCalendar.YEAR);
		int month =	date.get(GregorianCalendar.MONTH) + 1;

		System.out.println();

			printMonth(year, month);
	}


	public static void printMonth(int year, int month) {

		printMonthTitle(year, month);
		printMonthBody(year, month);
	}


	public static void printMonthTitle(int year, int month) {
		System.out.println("         " + getMonthName(month) + " " + year);
		System.out.println("-----------------------------");
		System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
	}


	public static String getMonthName(int month) {
		String monthName = "";

		switch (month) {
		case 1:
			monthName = "January";
			break;
		case 2:
			monthName = "February";
			break;
		case 3:
			monthName = "March";
			break;
		case 4:
			monthName = "April";
			break;
		case 5:
			monthName = "May";
			break;
		case 6:
			monthName = "June";
			break;
		case 7:
			monthName = "July";
			break;
		case 8:
			monthName = "August";
			break;
		case 9:
			monthName = "September";
			break;
		case 10:
			monthName = "October";
			break;
		case 11:
			monthName = "November";
			break;
		case 12:
			monthName = "December";
		}

		return monthName;
	}


	public static void printMonthBody(int year, int month) {
	
		int startDay = getStartDay(year, month);	
		int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);	
		int i = 0;

		for (i = 0; i < startDay; i++) {
			System.out.print("    ");
		}

		for (i = 1; i <= numberOfDaysInMonth; i++) {
			System.out.printf("%4d", i);

			if ((i + startDay) % 7 == 0) {
				System.out.println();
			}
		}

		System.out.println();
	}

	/** Get the start day of month/1/year */
	public static int getStartDay(int year, int month) {
		int dayOfTheWeek;

		if (month == 2) {
			month = 14;
			year -= 1;
		}

		if (month == 1) {
			month = 13;
			year -= 1;
		}

		dayOfTheWeek = (1 + (26 * (month + 1)) / 10 + (year % 100)
				+ ((year % 100) / 4) + ((year / 100) / 4) + (5 * (year / 100))) % 7;

		switch (dayOfTheWeek) {
		case 0:
			return 6;
		default:
			return dayOfTheWeek - 1;
		}
	}

	/** Get the total number of days since January 1, 1800 */
	public static int getTotalNumberOfDays(int year, int month) {
		int total = 0;

		// Get the total days from 1800 to 1/1/year
		for (int i = 1800; i < year; i++) {
			if (isLeapYear(i)) {
				total = total + 366;
			} else {
				total = total + 365;
			}
		}
		// Add days from Jan to the month prior to the calendar month
		for (int i = 1; i < month; i++) {
			total = total + getNumberOfDaysInMonth(year, i);
		}

		return total;
	}

	/** Get the number of days in a month */
	public static int getNumberOfDaysInMonth(int year, int month) {
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
				|| month == 10 || month == 12) {
			return 31;
		}

		if (month == 4 || month == 6 || month == 9 || month == 11) {
			return 30;
		}

		if (month == 2) {
			return isLeapYear(year) ? 29 : 28;
		}

		return 0; // If month is incorrect
	}

	/** Determine if it is a leap year */
	public static boolean isLeapYear(int year) {
		return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
	}
}